/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package psd.semana2.aula.semaforo;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

/**
 *
 * @author nfsa
 */
public class ContaImpl implements Conta {

    private int contador;
    private ReentrantLock lock;
    private Condition podeRetirar;

    public ContaImpl() {
        contador = 0;
        lock = new ReentrantLock();
        podeRetirar = lock.newCondition();
    }

    public ContaImpl (int inicial) {
        contador = inicial;
        lock = new ReentrantLock();
        podeRetirar = lock.newCondition();
    }

    public int valor() {
        int retorno = 0;
        lock.lock();
        retorno = contador;
        lock.unlock();
        return retorno;
    }

    public void somar (int valor) {
        lock.lock();
        contador += valor;
        podeRetirar.signalAll();
        lock.unlock();
    }

    public void subtrair (int valor) throws InterruptedException {
        lock.lock();
        while (contador - valor < 0) {
            podeRetirar.await();
        }
        contador -= valor;
        lock.unlock();
    }
}
